import dotenv from 'dotenv';
import { connectMongoDB, disconnectMongoDB, clearDatabase } from '@/databases/mongodb';
import { closeMysqlConnection } from '@/databases/mysql';
import { logger } from '@/utils/logger';

// 加载测试环境变量
dotenv.config({ path: '.env.test' });

// 设置测试环境
process.env.NODE_ENV = 'test';

/**
 * 全局测试设置
 */
beforeAll(async () => {
  try {
    // 连接测试数据库
    await connectMongoDB();
    logger.info('测试数据库连接成功');
  } catch (error) {
    logger.error(error, '测试数据库连接失败');
    throw error;
  }
});

/**
 * 每个测试套件前的清理
 */
beforeEach(async () => {
  try {
    // 清空测试数据库
    await clearDatabase();
  } catch (error) {
    logger.error(error, '清空测试数据库失败');
  }
});

/**
 * 全局测试清理
 */
afterAll(async () => {
  try {
    // 断开数据库连接
    await Promise.all([
      disconnectMongoDB(),
      closeMysqlConnection(),
    ]);
    logger.info('测试数据库连接已关闭');
  } catch (error) {
    logger.error(error, '关闭测试数据库连接失败');
  }
});

/**
 * 测试超时处理
 */
jest.setTimeout(30000);

/**
 * 抑制控制台输出（可选）
 */
if (process.env.SUPPRESS_LOGS === 'true') {
  console.log = jest.fn();
  console.error = jest.fn();
  console.warn = jest.fn();
  console.info = jest.fn();
}